<?php

use WeChatPay\Builder;
use WeChatPay\BuilderChainable;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;

include_once "wxBizDataCrypt.php";
include_once "errorCode.php";

class  WxHelper
{
    private $option = [
        'mchid' => '1680283395', //商户编号
        'appid' => 'wx1ce12f7b08c3c423', //小程序APPID
        'appKey' => '3ddb897e761f78a1cc2ee32fa7951627', //小程序秘钥
        'apiKey' => '67HfwDPOe3Dw4Gf23asdfcRkO784aas6', //api3密钥
        'serialNumber' => '2C144520DB26CAC114B2FA0445446976BCA55143' //证书序列号
    ];


    private function wxConfig()
    {
        # 微信支付配置
        return [
            'xcxid' => $this->option['appid'], // 小程序 appid
            'appid' => '', // 微信支付 appid
            'mchid' => $this->option['mchid'], // 微信支付 mch_id 商户收款账号
            'key' => $this->option['apiKey'], // 微信支付 apiV3key（尽量包含大小写字母，否则验签不通过，服务商模式使用服务商key）
            'appsecret' => '', // 公众帐号 secert (公众号支付获取 code 和 openid 使用)

            'sp_appid' => '', // 服务商应用 ID
            'sp_mchid' => '', // 服务商户号

            'notify_url' => 'http://test.dtapi.com/index.php/Index/payCb', // 接收支付状态的连接  改成自己的回调地址
            'redirect_url' => '', // 公众号支付，调起支付页面

            // 服务商模式下，使用服务商证书
            'serial_no' => $this->option['serialNumber'], // 证书序列号（可不传，默认根据证书直接获取）

            'cert_client' => '../config/apiclient_cert.pem', // 证书（退款，红包时使用）
            'cert_key' => '../config/apiclient_key.pem', // 商户私钥（Api安全中下载）
            'public_key' => './cert/public_key.pem', // 平台公钥（调动证书列表，自动生成，注意目录权限）
        ];
    }

    public function makeOrder($order)
    {
        $pay = new \fengkui\Pay\Wechat($this->wxConfig());
//        $order = [
//            'body'      => 'subject-测试', // 商品描述
//            'order_sn'  => time(), // 商户订单号
//            'total_amount' => 1, // 订单金额
//            'openid'    => 'openidxxxxxxxx', // 用户唯一标识
//        ];
        $result = $pay->xcx($order);
        return $result;
    }

    public function getCb()
    {
        $result = ['status' => 'no', 'data' => [], 'msg' => '支付失败'];
        $pay = new \fengkui\Pay\Wechat($this->wxConfig());
        // 支付回调
        try {
            $data = $pay->notify(); // 验签并获取支付回调相关参数
            if ($data) {
                $result["status"] = 'ok';
                $result['data'] = $data;
                $result['msg'] = '支付成功';
            }
        } catch (\Exception $e) {
            $result['msg'] = $e->getMessage(); // 错误信息
        }
        return $result;
    }


    /**
     * 微信登录获取openId
     * @param $data array 微信请求数据
     * @return array
     */
    public function WxDecode($data)
    {
        // 接收参数
        $appid = $this->option['appid'];
        $appsecret = $this->option['appKey'];
        $grant_type = "authorization_code"; //授权（必填）

        $code = $data['code'];        //有效期5分钟 登录会话
        $encryptedData = $data['encryptedData'];
        $iv = $data['iv'];
        $signature = $data['signature'];
        $rawData = $data['rawData'];

        // 拼接url
        $url = "https://api.weixin.qq.com/sns/jscode2session?" . "appid=" . $appid . "&secret=" . $appsecret . "&js_code=" . $code . "&grant_type=" . $grant_type;
        $res = json_decode($this->httpGet($url), true);


        $sessionKey = $res['session_key']; //取出json里对应的值
        $signature2 = sha1(htmlspecialchars_decode($rawData) . $sessionKey);

        $result = [
            'status' => 'no',
            'msg' => '查找失败'
        ];

        // 验证签名
        if ($signature2 !== $signature) {
            $result['msg'] = "验签失败";
            return $result;
        }

        // 获取解密后的数据
        $pc = new \WXBizDataCrypt($appid, $sessionKey);
        $getData = null;
        $errCode = $pc->decryptData($encryptedData, $iv, $getData);

        $result = [
            'status' => 'no',
            'msg' => '查找失败'
        ];

        if ($errCode == 0) {
            $result['status'] = 'ok';
            $result['msg'] = '查找成功';
            $result['data'] = json_decode($getData,true);
        }

        return $result;
    }


    private function httpGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }
}